<?php

use Sharks\Core\Http\View\JsonView;
use Sharks\Core\Http\View\RedirectView;
use Sharks\Core\Http\View\RouteView;
use Sharks\Core\Http\View\SmartyView;
use Sharks\Core\Http\View\StatusView;

/**
 * 视图展示
 * $view example:
 *     index => 
 *     Speedo.index => /~/Speedo/~/Views/Public/Default|Mobile/index.vue.php
 * @param  string $view 视图名称
 * @param  [type] $data 向视图传递的数据
 * @return SmartyView
 */
function view($view, $data = null) {
    $module = null;
    if (strpos($view, '.') > 1) {
        $vars = explode('.', $view);
        $module = $vars[0];
        $view = $vars[1];
    }
    return new SmartyView(SmartyView::TYPE_PUBLIC, $view, $data, $module);
}

/**
 * JSON
 * @param  array  $data 数据
 * @return JsonView
 */
function json(array $data) {
    return new JsonView($data);
}

/**
 * 跳转其它route
 * @param  string $action 跳转的action
 * @param  array  $params route参数
 * @param  array  $query  query参数
 * @param  string $hash   hash参数
 * @return RouteView         
 */
function route($action, array $params = array(), $query = array(), $hash = null) {
    return new RouteView($action, $params, $query, $hash);
}

/**
 * 重定向
 * @param  string $url   跳转的url
 * @param  array  $query query参数
 * @param  string $hash  hash参数
 * @return RedirectView
 */
function redirect($url, array $query = array(), $hash = null) {
    return new RedirectView($url, $query, $hash);
}

/**
 * 直接返回状态码，不返回内容
 * @param  string $code 状态码
 * @param  string $msg  
 * @return StatusView
 */
function status($code, $msg = null) {
    return new StatusView($code, $msg);
}

/**
 * 按照指定的状态码，在/Views/Public/error下返回一个错误视图
 * @param  string $code http状态码
 * @return ErrorView
 */
function error($code, $msg = null) {
	return new SmartyView(SmartyView::TYPE_PUBLIC, "error/$code", array('code'=>$code, 'msg'=>$msg));
}